using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace HelloWorld
{
    public partial class Form1 : Form
    {
        private ManualResetEvent manualResetEvent;
        private AutoResetEvent auto;
        private bool suspend;
        private AsyncOperation asyncOperation;

        public delegate void InvokeDelegate(string str);

        private InvokeDelegate invokeDelegate;
        const string str = "Test";
        private bool formClosed;


        public Form1()
        {
            InitializeComponent();
            manualResetEvent = new ManualResetEvent(false);
            auto = new AutoResetEvent(true);
            asyncOperation = AsyncOperationManager.CreateOperation(null);
            invokeDelegate = new InvokeDelegate(this.SafeInvoke);
            this.FormClosed += delegate
                                   {
                                       this.formClosed = true;
                                       this.auto.Close();
                                   };


        }

           
        private void btnStart_Click(object sender, EventArgs e)
        {
            this.btnStart.Enabled = false;
            this.btnSuspend.Enabled = true;
            ThreadPool.QueueUserWorkItem(delegate
                                             {
                                                 SafeInvoke();

                                                 //this.BeginInvoke(invokeDelegate, new object[] { str });
                                             });
        }

        private void btnSuspend_Click(object sender, EventArgs e)
        {
            this.btnSuspend.Enabled = false;
            this.btnResume.Enabled = true;
            this.suspend = true;
            manualResetEvent.Reset();
        }

        private void SafeInvoke(string s)
        {
            while (true)
            {
                if (formClosed)
                    return;

                Thread.Sleep(200);

                if (suspend)
                    this.auto.WaitOne();
                this.txtMessageBox.AppendText(s);
            }
        }

        private void SafeInvoke()
        {
            while (true)
            {
                if (formClosed)
                    return;

                Thread.Sleep(200);

                if (suspend)
                    //this.auto.WaitOne();
                    manualResetEvent.WaitOne();

                asyncOperation.Post(delegate
                                        {
                                            this.txtMessageBox.AppendText(str);
                                        }, str);
            }
        }

        private void btnResume_Click(object sender, EventArgs e)
        {
            this.btnResume.Enabled = false;
            this.btnSuspend.Enabled = true;
            this.suspend = false;
            //this.auto.Set();
            manualResetEvent.Set();
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            SubForm1 sf1 = new SubForm1( this);
            sf1.Show();
        }
    }
}


